package br.com.siscom.model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.siscom.conexao.InterfacePool;
import br.com.siscom.conexao.Pool;
import br.com.siscom.model.bean.Cliente;

public class ClienteDAO implements InterfaceClienteDAO {
	
	 private InterfacePool pool;
	
	public ClienteDAO(InterfacePool pool)
	{
		this.pool = pool;
	}

	@Override
	public void atualizar(Cliente cliente) throws SQLException {
		Connection con = pool.getConnection();
		PreparedStatement ps = null;
		String sqlAtualizar = " UPDATE cliente SET auditoria = ?, bairro = ?, celular = ?, cep = ?, " +
				" cidade = ?, cnpj = ?, cpf = ?, desde = ?, email = ?, empresa = ?, endereco = ?, estado = ?," +
				" fone = ?, foneemp = ?, foneref = ?, insest = ?, nascimento = ?, nome = ?, obs = ?, " +
				" orgaorg = ?, profissao = ?, referencia = ?, renda = ?, rg = ? , sexo = ? WHERE " +
				" codigo = ? ;";
		
		try {
			ps = con.prepareStatement(sqlAtualizar);
			
			setPreparedStatement(cliente, ps);
			
			ps.executeUpdate();
			ps.close();
		} finally {
			pool.liberarConnection(con);
		}
	}

	@Override
	public void excluir(Integer codigo) throws SQLException {
		Connection con = pool.getConnection();
		PreparedStatement ps = null;
		String sqlExcluir = "DELETE FROM cliente WHERE codigo = ?;";
		
		try {
			ps = con.prepareStatement(sqlExcluir);
			ps.setInt(1, codigo);
			ps.executeUpdate();
			ps.close();
		} finally {
			pool.liberarConnection(con);
		}		
	}

	@Override
	public Cliente getCliente(Integer codigo) throws SQLException {
		Connection con = pool.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sqlSelect = "SELECT * FROM cliente WHERE codigo = ?;";
		
		try {
			ps = con.prepareStatement(sqlSelect);
			ps.setInt(1, codigo);
			
			rs = ps.executeQuery();
			
			List<Cliente> resultado = getListaCliente(rs);
			if(resultado.size() > 0)
				return resultado.get(0);
			
			ps.close();
		} finally {
			pool.liberarConnection(con);
		}
		return null;
	}

	@Override
	public List<Cliente> getClientes() throws SQLException {
		List<Cliente> resultado = new ArrayList<Cliente>();
		Connection con = pool.getConnection();
		PreparedStatement ps = null;
		String sqlSelect = "SELECT * FROM cliente; ";
		ResultSet rs = null;
		
		try {
			ps = con.prepareStatement(sqlSelect);
			rs = ps.executeQuery();
			
			resultado = getListaCliente(rs);

			rs.close();
			ps.close();
		} finally{
			pool.liberarConnection(con);
		}
		return resultado;
	}
	
	private List<Cliente> getListaCliente(ResultSet rs) throws SQLException
	{
		List<Cliente> resultado = new ArrayList<Cliente>();
		while(rs.next())
		{
			Cliente cliente = new Cliente();
			cliente.setAuditoria(rs.getString("auditoria"));
			cliente.setBairro(rs.getString("bairro"));
			cliente.setCelular(rs.getString("celular"));
			cliente.setCep(rs.getString("cep"));
			cliente.setCidade(rs.getString("cidade"));
			cliente.setCnpj(rs.getString("cnpj"));
			cliente.setCodigo(rs.getInt("codigo"));
			cliente.setCpf(rs.getString("cpf"));
			cliente.setDesde(rs.getDate("desde"));
			cliente.setEmail(rs.getString("email"));
			cliente.setEmpresa(rs.getString("empresa"));
			cliente.setEndereco(rs.getString("endereco"));
			cliente.setEstado(rs.getString("estado"));
			cliente.setFone(rs.getString("fone"));
			cliente.setFoneemp(rs.getString("foneemp"));
			cliente.setFoneref(rs.getString("foneref"));
			cliente.setInsest(rs.getString("insest"));
			cliente.setNascimento(rs.getDate("nascimento"));
			cliente.setNome(rs.getString("nome"));
			cliente.setObs(rs.getString("obs"));
			cliente.setOrgaorg(rs.getString("orgaorg"));
			cliente.setProfissao(rs.getString("profissao"));
			cliente.setReferencia(rs.getString("referencia"));
			cliente.setRenda(rs.getDouble("renda"));
			cliente.setRg(rs.getString("rg"));
			cliente.setSexo(rs.getString("sexo"));
			resultado.add(cliente);
		}
		return resultado;
	}

	@Override
	public void salvar(Cliente cliente) throws SQLException 
	{
		Connection con = pool.getConnection();
		PreparedStatement ps;
		
		String sqlInsert = "INSERT INTO cliente (auditoria, bairro, celular, cep, " +
				" cidade, cnpj, cpf, desde, email, empresa, endereco, estado," +
				" fone, foneemp, foneref, insest, nascimento, nome, obs, " +
				" orgaorg, profissao, referencia, renda, rg, sexo, codigo) VALUES " +
				" (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " +
				" ?, ?, ?, ?, ?); ";
		
		try {
			ps = con.prepareStatement(sqlInsert);
			
			setPreparedStatement(cliente, ps);

			ps.executeUpdate();
			ps.close();
		} finally{
			pool.liberarConnection(con);
		}
	}

	private void setPreparedStatement(Cliente cliente, PreparedStatement ps)
			throws SQLException {
		ps.setObject(1, cliente.getAuditoria());
		ps.setObject(2, cliente.getBairro());
		ps.setObject(3, cliente.getCelular());
		ps.setObject(4, cliente.getCep());
		ps.setObject(5, cliente.getCidade());
		ps.setObject(6, cliente.getCnpj());
		ps.setObject(7, cliente.getCpf());
		ps.setDate(8, cliente.getDesde());
		ps.setString(9, cliente.getEmail());
		ps.setString(10, cliente.getEmpresa());
		ps.setString(11, cliente.getEndereco());
		ps.setString(12, cliente.getEstado());
		ps.setString(13, cliente.getFone());
		ps.setString(14, cliente.getFoneemp());
		ps.setString(15, cliente.getFoneref());
		ps.setString(16, cliente.getInsest());
		ps.setDate(17,cliente.getNascimento());
		ps.setString(18, cliente.getNome());
		ps.setString(19, cliente.getObs());
		ps.setString(20, cliente.getOrgaorg());
		ps.setString(21, cliente.getProfissao());
		ps.setString(22, cliente.getReferencia());
		ps.setObject(23, cliente.getRenda());
		ps.setString(24, cliente.getRg());
		ps.setString(25, cliente.getSexo());
		ps.setObject(26, cliente.getCodigo());
	}

}
